﻿#pragma once
#include <stdio.h>
#include <locale.h>
#include <stdlib.h>
#include <windows.h>
#include <stdbool.h>


#define WALL L'□'//定义□这个符号为宽字符作为墙体
#define BODY L'●'//定义●这个符号为宽字符作为蛇的身体
#define FOOD L'★'//定义★这个符号为宽字符作为食物
#define Init_x 24 //定义蛇尾的初始位置的x轴坐标
#define Init_y 5 //定义蛇尾的初始位置的y轴坐标

//定义一个宏，GetAsyncKeyStat返回的是short类型的值
//检测一个按键是否被按过，只需要看返回值的16位数字的最后一位是1还是0，是1就是按过否则为0
//把他与1按位与就可以得出最后一位的值是1还是0.
#define KEY_PRESS(VK) ( (GetAsyncKeyState(VK) & 0X1) ? 1 : 0 )


enum DIRECTION
{
	UP = 1,
	DOWN,
	LEFT,
	RIGHT
};

enum GAME_CONDATION
{
	OK,//表示游戏的状态是在游戏中
	OVER_BYSELF,//表示游戏状态为因为撞到自己结束游戏
	OVER_BYWALL,//表示游戏状态为因为撞到墙结束游戏
	OVER_ESC //表示游戏状态为按下ESC健正常退出游戏
};

//创建蛇身的节点，包括蛇身所在的坐标，和指向下一个蛇身地节点
typedef struct SnakeNode
{
	int x;
	int y;
	struct SnakeNode* next;
}SnakeNode,*pfSnakeNode;

//定义一个结构体用来描述贪吃蛇本身
typedef struct Snake
{
	pfSnakeNode head;//指向贪吃蛇的头部的指针
	pfSnakeNode food;//指向食物的指针
	int Score;//游戏的总得分
	int FoodScore;//吃一个食物的分数
	int SleepTime;//每走一步的休眠时间，休眠时间越长贪吃蛇的速度越慢，时间越短速度越快
	enum DIRECTION dir;//描述贪吃蛇的方向
	enum GAME_CONDATION cndn;

}Snake,*pfSnake;



//游戏开始前
void InitGame(pfSnake pf);

//打印欢迎进入贪吃蛇游戏界面
void WelcomeToGame();

//设置光标位置的函数
void SetPos(int x, int y);

//打印地图
void PrintMap();

//初始化蛇
void InitSnake(pfSnake pf);

//创建食物
void CreatFood(pfSnake pf);

//运行游戏设计
void RunGame(pfSnake pf);

//设计蛇的移动
void SnakeMove(pfSnake pf);

//下一个是食物
void EatFood(pfSnakeNode nextnode, pfSnake pf);

//下一个不是食物
void NoFood(pfSnakeNode next,pfSnake pf);

//撞墙
int KillByWall(pfSnake pf);

//撞到自己
int KillBySelf(pfSnake pf);

//游戏结束，游戏善后处理
void GameOver(pfSnake pf);






